﻿// auto_dcs.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <fstream>
#include <string>
#include <common/mini_dump.hpp>
#include <common/time_string.hpp>
#include <common/convert.hpp>

#include "scheduler.hpp"




void main_impl(const std::string &com, const std::filesystem::path &path, const std::filesystem::path &pdf_path, const std::vector<std::string> &analysis_elements, 
    const std::string &plc_ip, std::uint16_t plc_port, std::uint16_t central_port, std::uint16_t slave_id, float icpms_ratio, const std::string &match_key, std::uint32_t analysis_cnt) {
    std::ofstream os(path.filename().u8string() + ".log", std::ios::app);
    dcs::scheduler_t scheduler([&os](auto level, const auto& msg) {
        auto value = sys_time::to_string(std::time(0), dcs::time_format()) + " " + dcs::to_string(level) + stdex::to_a(stdex::from_utf8(msg));

        std::cout << value << std::endl;
        os << value << std::endl;
        }, com, path, pdf_path, match_key);

    auto ret = scheduler.start(analysis_elements, plc_ip, plc_port, central_port, slave_id, icpms_ratio, analysis_cnt);
    if (ret) {
        std::cin.get();
    }

    scheduler.stop();
}

int main(int argc, char **argv)
{
    if (argc < 12) {
        std::cerr << "请输入正确启动参数[COM] [Monitor Path] [PDF Path] [Analysis Elements] [Central Port] [Salve ID] [Fix Ratio] [PLC IP] [PLC Port] [Match Key] [Analysis Count]" << std::endl;
        return -1;
    }

    win32::debug::mini_dump dump;

    std::vector<std::string> elements;
    std::string token;
    std::istringstream tokenStream(argv[4]);
    while (std::getline(tokenStream, token, ',')) {
        elements.push_back(token);
    }

    std::cout << "分析元素[" << argv[4] << "]" << std::endl;
    main_impl(argv[1], argv[2], argv[3], elements, argv[8], (std::uint16_t)std::stoul(argv[9]), (std::uint16_t)std::stoul(argv[5]), (std::uint16_t)std::stoul(argv[6]), std::stof(argv[7]), argv[10], std::stoul(argv[11]));

    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
